const TAG_NAME = 'VR-WS';
let socketOpen = false; // ws是否成功连接
let socketMsgQueue = []; // 存储socket消息
let count = 0;

module.exports = {
  /**
   * 处理发送的数据
   * @param {*} msg 发送数据
   */
  dealMessage(msg) {
    // 不发送日志的话 过滤掉日志数据
    if (!getApp().globalData.ifSendLog && msg.cmd === 'log') {
      return;
    }
    let message = null;
    try {
      message = JSON.stringify(msg)
    } catch (e) {
      // JSON.stringify() 报错后忽略掉该条信息 避免报错
      return;
    }
    this.wxSendWsMsg(message);
  },

  /**
   * 连接websocket
   * @param {*} url ws 的地址
   * @param {*} callback ws 接收到消息调用的方法
   */
  initWS(url, callback) {
    console.log(TAG_NAME, "准备连接ws", url)
    const self = this;
    wx.connectSocket({
      url,
      timeout: 10000,
      success: function (res) {
        console.log(TAG_NAME, "ws连接成功", res);
      },
      fail: function (res) {
        console.error(TAG_NAME, "ws连接失败", res, url);
        if (count > 3) {
          self.showError("网络连接异常")
        } else {
          // websocket重连
          count = count + 1;
          self.initWS(url, callback)
        }
      }
    });
    // 监听ws是否连接成功
    wx.onSocketOpen((res) => {
      console.log(TAG_NAME, "ws连接打开成功", res);
      socketOpen = true;
      count = 0;
      // 如果消息队列中有数据 将数据发送出去
      if (socketMsgQueue.length > 0) {
        socketMsgQueue.forEach((msg) => {
          self.dealMessage(msg);
        });
        socketMsgQueue = [];
      }
    });
    // 监听ws连接失败
    wx.onSocketError((res) => {
      console.error(TAG_NAME, "ws异常", res)
    });
    // 监听ws连接关闭
    wx.onSocketClose((res) => {
      console.error(TAG_NAME, "ws连接关闭", res, url)
      if (!res.reason || !res.reason.includes("hy-")) {
        if (count > 3) {
          self.showError("网络连接异常")
        } else {
          // websocket重连
          count = count + 1;
          self.initWS(url, callback)
        }
      }
    });
    // 监听ws收到消息
    wx.onSocketMessage((res) => {
      const msg = JSON.parse(res.data)
      console.log(TAG_NAME, "收到ws消息", res)
      callback(msg);
    });
  },

  /**
   * wx调用ws发送数据
   * @param {*} msg 发送的数据
   */
  wxSendWsMsg(msg) {
    wx.sendSocketMessage({
      data: msg,
      success: function (res) {
        // console.log(TAG_NAME, "ws消息发送成功", msg, res);
      },
      fail: function (res) {
        console.error(TAG_NAME, "ws消息发送失败", msg, res);
      }
    })
  },

  /**
   * 发送ws消息
   * @param {*} msg 
   */
  sendWsMsg(msg) {
    // 连接开启并且消息队列中无数据
    if (socketOpen && socketMsgQueue.length === 0) {
      this.dealMessage(msg);
    } else {
      socketMsgQueue.push(msg);
    }
  },

  /**
   * 关闭ws连接
   * @param msg 参数
   */
  closeWs(msg) {
    // 当连接打开时关闭连接
    if (socketOpen) {
      wx.closeSocket({
        reason: "hy-正常关闭" + msg,
        success: function (res) {
          console.log(TAG_NAME, "ws连接关闭成功", res);
          socketOpen = false;
          socketMsgQueue = [];
        },
        fail: function (res) {
          console.error(TAG_NAME, "ws连接关闭失败", res);
        }
      })
    }
  },

  /**
   * 统一错误处理
   * @param {*} msg
   */
  showError(msg) {
    wx.redirectTo({
      url: '/pages/tic/room_webview/index/index?type=hangup' + '&msg=' + msg,
    })
  },
}